package store

import (
	"context"
	"errors"
	"time"
)

// StateType 表示状态类型
type StateType string

const (
	// StateTypeKV 表示键值状态类型
	StateTypeKV StateType = "kv"
	// StateTypeTable 表示表格状态类型
	StateTypeTable StateType = "table"
	// StateTypeDocument 表示文档状态类型
	StateTypeDocument StateType = "document"
	// StateTypeCounter 表示计数器状态类型
	StateTypeCounter StateType = "counter"
	// StateTypeGauge 表示度量值状态类型
	StateTypeGauge StateType = "gauge"
	// StateTypeHistogram 表示直方图状态类型
	StateTypeHistogram StateType = "histogram"
)

// StateScope 表示状态作用域
type StateScope string

const (
	// StateScopeLocal 表示本地作用域
	StateScopeLocal StateScope = "local"
	// StateScopeGlobal 表示全局作用域
	StateScopeGlobal StateScope = "global"
	// StateScopePartition 表示分区作用域
	StateScopePartition StateScope = "partition"
)

// StateConfig 表示状态配置
type StateConfig struct {
	// Name 是状态名称
	Name string
	// Type 是状态类型
	Type StateType
	// Scope 是状态作用域
	Scope StateScope
	// TTL 是生存时间
	TTL time.Duration
	// Persistent 是持久化标志
	Persistent bool
	// Options 是额外选项
	Options map[string]interface{}
}

// StateStore 表示状态存储接口
type StateStore interface {
	// Init 初始化状态存储
	Init(ctx context.Context, config map[string]interface{}) error
	// Close 关闭状态存储
	Close(ctx context.Context) error
	// CreateState 创建状态
	CreateState(ctx context.Context, config *StateConfig) (State, error)
	// GetState 获取状态
	GetState(ctx context.Context, name string) (State, error)
	// DeleteState 删除状态
	DeleteState(ctx context.Context, name string) error
	// ListStates 列出所有状态
	ListStates(ctx context.Context) ([]string, error)
	// Flush 刷新状态
	Flush(ctx context.Context) error
}

// State 表示状态接口
type State interface {
	// Name 返回状态名称
	Name() string
	// Type 返回状态类型
	Type() StateType
	// Scope 返回状态作用域
	Scope() StateScope
	// Close 关闭状态
	Close(ctx context.Context) error
}

// KVState 表示键值状态接口
type KVState interface {
	State
	// Get 获取值
	Get(ctx context.Context, key string) ([]byte, error)
	// Set 设置值
	Set(ctx context.Context, key string, value []byte) error
	// Delete 删除值
	Delete(ctx context.Context, key string) error
	// Keys 获取所有键
	Keys(ctx context.Context) ([]string, error)
}

// TableState 表示表格状态接口
type TableState interface {
	State
	// GetRow 获取行
	GetRow(ctx context.Context, key string) (map[string][]byte, error)
	// GetCell 获取单元格
	GetCell(ctx context.Context, key string, column string) ([]byte, error)
	// SetRow 设置行
	SetRow(ctx context.Context, key string, row map[string][]byte) error
	// SetCell 设置单元格
	SetCell(ctx context.Context, key string, column string, value []byte) error
	// DeleteRow 删除行
	DeleteRow(ctx context.Context, key string) error
	// DeleteCell 删除单元格
	DeleteCell(ctx context.Context, key string, column string) error
	// Keys 获取所有键
	Keys(ctx context.Context) ([]string, error)
	// Columns 获取所有列
	Columns(ctx context.Context, key string) ([]string, error)
}

// DocumentState 表示文档状态接口
type DocumentState interface {
	State
	// Get 获取文档
	Get(ctx context.Context, id string) ([]byte, error)
	// Set 设置文档
	Set(ctx context.Context, id string, document []byte) error
	// Delete 删除文档
	Delete(ctx context.Context, id string) error
	// Query 查询文档
	Query(ctx context.Context, query string) ([][]byte, error)
	// IDs 获取所有ID
	IDs(ctx context.Context) ([]string, error)
}

// CounterState 表示计数器状态接口
type CounterState interface {
	State
	// Get 获取计数
	Get(ctx context.Context, key string) (int64, error)
	// Increment 增加计数
	Increment(ctx context.Context, key string, amount int64) (int64, error)
	// Decrement 减少计数
	Decrement(ctx context.Context, key string, amount int64) (int64, error)
	// Reset 重置计数
	Reset(ctx context.Context, key string) error
	// Keys 获取所有键
	Keys(ctx context.Context) ([]string, error)
}

// GaugeState 表示度量值状态接口
type GaugeState interface {
	State
	// Get 获取度量值
	Get(ctx context.Context, key string) (float64, error)
	// Set 设置度量值
	Set(ctx context.Context, key string, value float64) error
	// Adjust 调整度量值
	Adjust(ctx context.Context, key string, delta float64) (float64, error)
	// Reset 重置度量值
	Reset(ctx context.Context, key string) error
	// Keys 获取所有键
	Keys(ctx context.Context) ([]string, error)
}

// HistogramState 表示直方图状态接口
type HistogramState interface {
	State
	// Record 记录值
	Record(ctx context.Context, key string, value float64) error
	// Reset 重置直方图
	Reset(ctx context.Context, key string) error
	// Count 获取计数
	Count(ctx context.Context, key string) (int64, error)
	// Sum 获取总和
	Sum(ctx context.Context, key string) (float64, error)
	// Min 获取最小值
	Min(ctx context.Context, key string) (float64, error)
	// Max 获取最大值
	Max(ctx context.Context, key string) (float64, error)
	// Mean 获取平均值
	Mean(ctx context.Context, key string) (float64, error)
	// Percentile 获取百分位数
	Percentile(ctx context.Context, key string, p float64) (float64, error)
	// Keys 获取所有键
	Keys(ctx context.Context) ([]string, error)
}

// StateStoreFactory 表示状态存储工厂接口
type StateStoreFactory interface {
	// Create 创建状态存储
	Create(ctx context.Context, config map[string]interface{}) (StateStore, error)
}

// StateStoreRegistry 表示状态存储注册表
type StateStoreRegistry struct {
	// factories 是工厂映射表
	factories map[string]StateStoreFactory
}

// NewStateStoreRegistry 创建一个新的状态存储注册表
func NewStateStoreRegistry() *StateStoreRegistry {
	return &StateStoreRegistry{
		factories: make(map[string]StateStoreFactory),
	}
}

// Register 注册状态存储工厂
func (r *StateStoreRegistry) Register(name string, factory StateStoreFactory) {
	r.factories[name] = factory
}

// Create 创建状态存储
func (r *StateStoreRegistry) Create(ctx context.Context, name string, config map[string]interface{}) (StateStore, error) {
	factory, ok := r.factories[name]
	if !ok {
		return nil, errors.New("state store factory not found")
	}
	return factory.Create(ctx, config)
}

// GetFactories 获取所有工厂
func (r *StateStoreRegistry) GetFactories() map[string]StateStoreFactory {
	return r.factories
}
